/**

数字 n 代表生成括号的对数，请你设计一个函数，用于能够生成所有可能的并且 有效的 括号组合。

有效括号组合需满足：左括号必须以正确的顺序闭合

示例 1：

输入：n = 3
输出：["((()))","(()())","(())()","()(())","()()()"]
示例 2：

输入：n = 1
输出：["()"]

*/
class Solution {
    List<String> res=new ArrayList();
    public List<String> generateParenthesis(int n) {
        dfs(n,n,n,new StringBuilder());
        return res;
    }
    public void dfs(int n,int pre,int next,StringBuilder sb){
        if(sb.length()==2*n){
            res.add(sb.toString());
            return;
        }
        if(pre>0){
            sb.append("(");
            dfs(n,pre-1,next,sb);
            sb.deleteCharAt(sb.length() - 1);
        }
        if(next>0 && pre<next){
            sb.append(")");
            dfs(n,pre,next-1,sb);
            sb.deleteCharAt(sb.length() - 1);
        }

    }
}